.. _time_synchronization_service:

Служба синхронизации времени
----------------------------

Служба синхронизации времени в домене необходима для корректной работы следующих ключевых механизмов в домене:

* аутентификации по протоколу **Kerberos**;

* двухфакторной аутентификации на основе синхронизированных по времени одноразовых паролей;

* разрешения конфликтов при репликации;

* возможности сопоставления журналов событий с разных серверов.

Служба ``chrony`` (демон ``chronyd``) запускается после загрузки операционной системы и начинает отправлять запросы на **NTP**-серверы, указанные в файле конфигурации ``/etc/chrony/chrony.conf``. После получения ответа от **NTP**-серверов, служба ``chrony`` выбирает по внутреннему алгоритму надежные (доверенные) источники времени, а затем на основании параметров из файла конфигурации из надежных источников выбирает тот, с которым будет проводиться синхронизация времени данного клиента. После выбора источника служба ``chrony`` обновляет системное время.

Функционирование подсистемы **NTP** в домене под управлением **ALD Pro** осуществляется с помощью динамических DNS-записей и групповой политики для синхронизации времени. В данном разделе рассмотрим работу групповой политики, а в следующем разделе остановимся подробнее на динамических DNS-записях.

В **ALD Pro** за обновление файла конфигурации службы ``chrony`` отвечает коробочная групповая политика, которая находится по пути ``/srv/aldpro-salt/roots/states/policies/host-policies/rbta_ldap_date_time_h``. В данной политике для выбора источника точного времени предусмотрен параметр ``stratumweight``, который установлен в значение 1, что означает максимальный приоритет надежному источнику (или источникам) точного времени с минимальным значением этого параметра. Также для ускорения процедуры первичной синхронизации времени клиента при запуске службы или при восстановлении потерянной на время связи с выбранным источником групповая политика прописывает для каждого сервера или пула **NTP**-серверов параметр ``iburst``. Данный параметр отвечает за настройку службы ``chrony``, которая заставляет клиента службы сразу после запуска отправлять серию из первых четырех **NTP**-пакетов с коротким интервалом в 2 секунды. Это позволяет демону быстрее собрать достаточно данных для точного измерения задержки сети и для возможности немедленной корректировки времени. Дополнительно групповой политикой задается параметр ``makestep`` для возможности быстрой коррекции времени при большой разнице во времени текущего клиента и выбранного сервера.

После первичной синхронизации времени между клиентом и выбранным **NTP**-сервером процесс синхронизации времени с сервером продолжается на протяжении всего времени работы службы ``chrony`` на всех компьютерах в домене. Обычно вмешательства в работу данного механизма, который минимизирует ошибки времени на клиенте и обеспечивает точность работы системных часов, не требуется. Согласно внутреннему алгоритму службы ``chrony``, в случае небольших отклонений между показателями часов текущего клиента и выбранного **NTP**-сервера, процесс периодических опросов с помощью **NTP**-пакетов, будет проходить все реже до достижения значения, определяемого параметром ``maxpoll``. В групповой политике из состава **ALD Pro** этот параметр не задается, следовательно служба ``chrony`` использует те значения по умолчанию, которые у нее есть. Значение по умолчанию для параметра ``minpoll`` - 6. Оно означает, что минимальный интервал синхронизации времени с выбранным источником будет равен 64 секунды (т.е 2 в шестой степени секунд). Значение по умолчанию для параметра ``maxpoll`` - 10. Оно означает, что максимальный интервал синхронизации времени с выбранным источником будет равен 1024 секунды (т.е 2 в десятой степени секунд). В зависимости от различных обстоятельств, например, в зависимости от текущей разницы времени между клиентом и выбранным сервером, или от стабильности времени задержки между посылкой **NTP**-запроса и ответом на него, служба ``chrony`` может варьировать время периодического запроса к **NTP**-серверу. Текущее значение параметра можно посмотреть с помощью команды ``chronyc sources``. В результатах вывода в колонке **Poll** в строке с выбранным **NTP**-сервером будет текущее значение, которое является степенью двойки количества секунд между опросами этого источника времени.

Выбор источника точного времени (в реализации "коробочной" групповой политики) в домене для каждого компьютера осуществляется на основе иерархической системы:

.. list-table:: Иерархия
   :widths: 5 15 15 30 35
   :header-rows: 1
   :class: longtable


   * - 
     - Приоритет в иерархии источников (по значению параметра minstratum)
     - Тип контроллера домена
     - Описание
     - Примечание
   * - 1
     - Высший
     - Внешний источник (или другой эталон)
     - NTP-сервер, который находится за пределами инфраструктуры компании
     - Данные источники вносятся в конфигурацию службы chrony с помощью коробочной групповой политики только для тех контроллеров домена, которые выступают в роли корневых NTP-серверов в домене ALD Pro.
   * - 2
     - Высокий
     - Корневой КД сайта
     - Контроллер домена, который объявлен корневым через портал управления ALD Pro и находится в том же сайте, что и клиент, который осуществляет синхронизацию времени
     - Данные источники будут являться приоритетными для всех клиентов и обычных контроллеров домена в этом сайте (принадлежность к сайту определяется настройками на портале управления ALD Pro и работой службы DNS при выполнении запросов)
   * - 3
     - Средний
     - Корневой КД домена (не из сайта)
     - Контроллер домена, который объявлен корневым через портал управления ALD Pro, но находится в другом сайте относительно клиента в домене.
     - Данные источники прописаны в конфигурации обычных контроллеров домена (некорневых NTP-серверов) и обычных клиентов домена (любые компьютеры, которые не являются NTP-серверами в домене) и они выбираются в том случае, когда нет корневых NTP-серверов из сайта клиента.
   * - 4
     - Низкий
     - Обычный КД сайта
     - Контроллер домена, который синхронизирует время с корневым NTP-сервером и дополнительно выступает в качестве источника времени для клиентов из того же сайта
     - Данные источники прописаны в конфигурации обычных контроллеров домена (некорневых NTP-серверов) и обычных клиентов домена (любые компьютеры, которые не являются NTP-серверами в домене). В связи с наличием опции orphan, такой КД может выступать в качестве источника точного времени для других КД этого сайта и для клиентов домена в этом сайте в случае отсутствия связи с корневыми NTP-серверами в домене
   * - 5
     - Минимальный
     - Обычный КД домена (не из сайта)
     - Контроллер домена, который синхронизирует время с корневым NTP-сервером или с другим контроллером домена из сайта этого контроллера, но при этом находится в другом сайте относительно клиента
     - Данные источники прописаны в конфигурации клиентов домена (любые компьютеры, которые не являются NTP-серверами в домене). Такой КД может выступать в качестве источника точного времени для клиентов домена в том случае, если у клиента нет связи ни с корневыми NTP-серверами, ни с КД из "своего" сайта

При реализации иерархической системы **NTP**-серверов, которая настраивается в конфигурации службы ``chrony`` с помощью коробочной групповой политики (условно будет называться ``timeGP``), необходимо учесть следующую информацию:

- уровень внешнего источника используется только для корневых контроллеров домена (КД); 
- если для конкретного клиента ``chrony`` возникает ситуация, что источника на каком-то уровне нет, то берется следующий за ним уровень и осуществляется попытка синхронизации с источником этого уровня.

При установке **ALD Pro** первый КД в домене автоматически становится корневым **NTP**-сервером домена. Дальнейшие изменения конфигурации администратор делает самостоятельно с помощью портала управления **ALD Pro** или с помощью **API** **ALD Pro**. Другие способы внесения изменений в конфигурацию службы **NTP** в домене являются крайне опасными и могут привести к неработоспособности либо всего домена, либо части клиентов.

При необходимости внесения изменений в конфигурацию коробочной групповой политики ``timeGP`` рекомендуется пользоваться следующими параметрами в групповых политиках ALD Pro:

1. для внесения общих изменений в конфигурацию службы ``chrony`` рекомендуется использовать параметр **Настройки сервиса сетевого времени Chrony**, который находится по пути **Параметры компьютеров** → **Система** → **Дата и время**. В случае использования данного параметра для определенных клиентов в домене администратор должен детально понимать работу службы ``chrony`` при сделанных изменениях в конфигурации на тех компьютерах, для которых выполняется изменение конфигурации службы. В случае, если групповая политика с включенным параметром будет снята с компьютеров (то есть возникнет ситуация, когда данный параметр больше не назначается на компьютер), то на таком компьютере начнет применяться стандартная политика ``timeGP``;

2. для внесения изменений в конфигурацию службы ``chrony`` в части используемых для синхронизации времени **NTP**-серверов (пулов) рекомендуется использовать параметр **Параметры сервера или пула сетевого времени**, который также находится по пути **Параметры компьютеров** → **Система** → **Дата и время**. Однако при внесении таких изменений в конфигурации службы chrony на определенных компьютерах домена также необходимо понимать все возможные нюансы работы.

По умолчанию на всех корневых КД домена должна быть следующая конфигурация службы ``chrony`` (после применения групповой политики - :ref:`timeGP`):

.. code-block:: console
    
   allow 0/0       
   stratumweight 1 
   combinelimit 0  
   local stratum 11 orphan 
   pool external_ntp_pool iburst minstratum 11    
   server external_ntp_server iburst minstratum 11        # при наличии записи (записей) в ПУ

Строки, начинающиеся с ``pool`` или ``server`` будут в файле конфигурации службы только в том случае, когда на портале управления **ALD Pro** указаны внешние **NTP**-пулы или **NTP**-серверы соответственно. Вместо строки ``external_ntp_pool`` в файл конфигурации будет подставляться значение внешнего **NTP**-пула (или несколько значений), заданное в портале управления. Вместо строки ``external_ntp_server`` в файл конфигурации с помощью ``timeGP`` попадет значение внешнего **NTP**-сервера, заданного через портал управления (или несколько серверов). Порядок строк имеет значение. Служба ``chrony`` будет выбирать первый в списке источник с минимальным значением параметра ``minstratum`` (в данном случае все внешние источники будут со значением 11, все будут равноранговыми), который она по своему внутреннему алгоритму посчитает доверенным и надежным. В случае **NTP**-пула будет выбран один из серверов внутри этого пула.

Если в портале управления **ALD Pro** в подразделе **Роли и службы сайта** → **Служба синхронизации времени** на вкладке **Внешний пул NTP-серверов** не заданы никакие **NTP**-серверы или **NTP**-пулы, то в этом случае будет использоваться директива ``orphan`` и текущий корневой **NTP**-сервер в домене **ALD Pro** станет самостоятельным источником точного времени для других **NTP**-серверов и клиентов домена.

По умолчанию на всех КД, которые не являются корневыми, должна быть следующая конфигурация службы ``chrony`` (после применения групповой политики - :ref:`timeGP`):

.. code-block:: console
    
   allow 0/0       
   stratumweight 1 
   combinelimit 0  
   local stratum 14 orphan    
   pool _ntp._udp._roots.{domain} iburst minstratum 12               
   pool _ntp._udp._roots._default.{domain} iburst minstratum 13       
   pool _ntp._udp.{domain} iburst minstratum 14

В данном случае при такой конфигурации обычного КД обеспечивается схема работы, описанная выше. В случае наличия корневого **NTP**-сервера в "своем" сайте синхронизация времени происходит с одним из таких серверов. Если таких **NTP**-серверов нет, то проверяются корневые **NTP**-серверы домена (вне "своего" сайта). Если их не обнаружено, то в связи с тем, что для каждого некорневого КД добавлена директива ``local stratum 14 orphan``, в результате отрабатывает алгоритм ``chrony``, позволяющий выбрать источник точного времени среди всех таких КД из одного сайта в соответствии с их параметром ``RefID`` (который в этом случае формируется из IP-адреса). В результате КД сайта с минимальным значением IP-адреса станет самостоятельным источником точного времени и таким **NTP**-сервером, к которому подключатся другие КД этого сайта.

 По умолчанию на всех клиентах домена должна быть следующая конфигурация службы chrony (после применения групповой политики - :ref:`timeGP`):

.. code-block:: console

   stratumweight 1
   combinelimit 0
   local
   pool _ntp._udp._roots.{domain} iburst minstratum 12              
   pool _ntp._udp._roots._default.{domain} iburst minstratum 13
   pool _ntp._udp.{domain} iburst minstratum 14                       
   pool _ntp._udp._default.{domain} iburst minstratum 15  

Согласно данной конфигурации реализуется иерархическая система **NTP**-серверов в домене, описанная выше. На уровне обычного клиента домена не может быть внешних **NTP**-серверов, если администратор явно не задал такое поведение с помощью параметра групповых политик **Параметры сервера или пула сетевого времени**, который находится по пути **Параметры компьютеров** → **Система** → **Дата и время**.

Форсировать обновление настроек службы ``chrony`` (и в случае наличия изменений произойдет перезапись файла файла конфигурации службы ``/etc/chrony/chrony.conf`` и перезапуск самой службы) можно следующей командой::

.. code-block:: bash

   aldpro-salt-call state.apply policies.host-policies.rbta_ldap_date_time_h

Динамические DNS-записи
~~~~~~~~~~~~~~~~~~~~~~~

Начиная с 2.5.0, реализован функционал подсистемы **NTP**, который выполняет корректировку **DNS**-записей в базе данных:

* при добавлении и удалении контроллеров в домен;

* при изменении привязки контроллеров к сайтам;

* при изменении параметров корневых **NTP**-серверов (добавлении и удалении их через портал управления).

Поддерживает выполнение следующих действий:

* Добавление двух динамических записей типа **CNAME** для корневых и простых контроллеров в рамках сайтов (``locations``):

    * ``_ntp._udp._roots.ald.company.lan`` ведет на ``_ntp._udp._roots.{this_location}._locations.ald.company.lan``, где:
        
        ``{this_location}`` - конкретный ``location`` того **DNS**-сервера, который обрабатывает запрос;

    * ``_ntp._udp.ald.company.lan`` ведет на ``_ntp._udp.{this_location}._locations.ald.company.lan``.

* Создание двух множеств **DNS**-записей типа A в рамках сайта (``location``):

    * ``_ntp._udp._roots.{some_location}._locations.ald.company.lan`` - пул A-записей с корневыми **NTP**-серверами в текущей локации;

    * ``_ntp._udp.{some_location}._locations.ald.company.lan`` - пул обычных контроллеров домена в текущей локации (может включать все контроллеры домена, если все КД находятся в ``одном location``).

* Создание двух множеств **DNS**-записей типа А в рамках домена:

    * ``_ntp._udp._roots._default.ald.company.lan`` - пул всех корневых **NTP**-серверов домена (**CNAME**), в том числе и тех, у которых признак ``location`` не заполнен;

    * ``_ntp._udp._default.ald.company.lan`` - пул контроллеров домена (не **CNAME**), в том числе и тех, у которых признак ``location`` не заполнен.

Алгоритм автоматической настройки подсистемы NTP
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Начиная с версии 2.5.0, на КД устанавливается служба ``aldpro-ntp-management``, которая раз в 2 минуты запускает проверку ``healthcheck NTP``. Демон **NTP** получает данные из **LDAP**-каталога о записях сайтов, о внешних и корневых **NTP**-серверах домена, данные всех активных КД (по умолчанию в конфигурационном файле ``chrony`` прописана строка "allow 0/0", что позволяем им выступать в качестве **NTP**-сервера) и данные о **DNS**-записях. Демон проводит расчет того, как должны выглядеть dns-записи, исходя из всех полученных из LDAP-каталога данных, и сверяет это рассчитанное состояние с тем, которое хранится в каталоге. Если все совпадает, то никаких изменений демон не производит, после чего демон засыпает на 2 минуты, затем процедура повторяется.

.. attention::

   Демон **NTP** ``aldpro-ntp-management`` устанавливается на каждый КД из состава домена, при этом должен функционировать (находиться в статусе ``active(running)``) только на одном КД домена. Для проверки необходимо на каждом КД выполнить команду:

   .. code-block:: bash

       systemctl is-active aldpro-ntp-management
        
   На всех КД, кроме одного, этот демон должен иметь состояние ``inactive``.


Все запросы к **LDAP**-каталогу этот демон делает под системной учетной записью.

Все действия демона записываются в журнал службы ``journalctl``, который можно просмотреть командой:

.. code-block:: bash
    
   journalctl -u aldpro-ntp-management # для просмотра полного лога службы
   journalctl -fu aldpro-ntp-management # для потокового просмотра лога службы

При добавлении любого КД в домен, в сайт, в состав которого вошел этот КД, добавляются записи в ветку службы **dns** по следующим путям:

.. code-block:: console
    
   idnsname=_ntp._udp._default,idnsname={DOMAIN_NAME}.,cn=dns,dc=*  добавляется атрибут aRecord=IP_ADDRESS_DC
   idnsname=_ntp._udp.hq._locations,idnsname={DOMAIN_NAME}.,cn=dns,dc=* при добавлении этого КД в сайт hq также добавляется атрибут aRecord=IP_ADDRESS_DC

При добавлении внешнего **NTP**-сервера с наименованием ``server1``, в ветку **LDAP**-каталога ``cn=ntp,cn=services,cn=aldpro,cn=etc,dc*`` добавляется запись ``ntpserver=server1`` с атрибутами:

.. code-block:: bash
    
   externalntpservertype=server # для пула будет значение pool
   isexternal=true
   ntpserver=server1

В дальнейшем из этой ветки берутся данные при заполнении конфигурации службы ``chronyd`` на всех компьютерах домена с помощью групповой политики времени (см. ниже).

При добавлении нового корневого **NTP**-сервера домена, т.е. при смене статуса КД с "обычного" на "корневой", его запись (``aRecord`` с IP-адресом этого КД) перемещается и располагается между записями в ветке службы **DNS**:

#. из записи сайта для "обычных" КД в запись сайта для "корневых" КД по пути ``idnsname=_ntp._udp._roots.hq._locations,idnsname={DOMAIN_NAME}.,cn=dns,dc=*``;

#. добавляется ``aRecord=IP-ADDR_DC`` в запись ``idnsname=_ntp._udp._roots._default,idnsname={DOMAIN_NAME}.,cn=dns,dc=*``.

Помимо этого, в **LDAP**-каталог в ветку ``cn=ntp,cn=services,cn=aldpro,cn=etc,dc*`` добавляется запись ``ntpserver=FQDN_DC``, где ``FQDN_DC`` - ``fqdn`` добавленного корневого **NTP**-сервера домена. Эта запись содержит атрибут ``isexternal=FALSE`` и атрибут ``server=FQDN_DC``.

При удалении корневого **NTP**-сервера домена происходит процесс, обратный сценарию добавления нового корневого **NTP**-сервера.

.. _timeGP:

Коробочная групповая политика времени вносит в конфигурацию службы ``chrony`` на корневых **NTP**-серверах домена, обычных КД и клиентов домена необходимую информацию как о наборе параметров самой службы, так и о пулах в конфигурации по умолчанию. Конфигурации для корневых **NTP**-серверов, обычных **NTP**-серверов и клиентов в домене приведены в разделе :ref:`time_synchronization_service`.

При этом для корневых **NTP**-серверов заменяются значения ``external_ntp_pool`` на значения атрибутов ``ntpserver`` тех записей из ветки ``cn=ntp,cn=services,cn=aldpro,cn=etc,dc*``, у которых атрибут ``externalntpservertype=pool`` (количество таких строк будет равно количеству записей) и значения ``external_ntp_server`` на значения атрибутов ``ntpserver`` тех записей из ветки ``cn=ntp,cn=services,cn=aldpro,cn=etc,dc*``, у которых атрибут ``externalntpservertype=server`` по такой же схеме.

При удалении КД из домена из каталога удаляются все атрибуты ``aRecord`` с IP-адресом этого КД. При удалении внешних **NTP**-серверов или пулов происходит удаление соответствующей записи ``cn=ntpserver=DELETED_ITEM`` в ветке ``cn=ntp,cn=services,cn=aldpro,cn=etc,dc*``. И после срабатывания коробочной групповой политики времени (в том числе после перезагрузки корневого КД домена) на всех корневых КД домена эти записи с удаленным сервером/пулом пропадают из конфигурационного файла службы ``chrony``, расположенного по пути ``/etc/chrony/chrony.conf``.